home *** CD-ROM | disk | FTP | other *** search
/ Aminet 40 / Aminet 40 (2000)(Schatztruhe)[!][Dec 2000].iso / Aminet / dev / lang / Python16_Src.lha / Python16_Source / Parser / node.c < prev    next >
Encoding:
C/C++ Source or Header  |  2000-08-03  |  1.2 KB  |  77 lines

  1. /* Parse tree node implementation */
  2.  
  3. #include "pgenheaders.h"
  4. #include "node.h"
  5.  
  6. node *
  7. PyNode_New(type)
  8.     int type;
  9. {
  10.     node *n = PyMem_NEW(node, 1);
  11.     if (n == NULL)
  12.         return NULL;
  13.     n->n_type = type;
  14.     n->n_str = NULL;
  15.     n->n_lineno = 0;
  16.     n->n_nchildren = 0;
  17.     n->n_child = NULL;
  18.     return n;
  19. }
  20.  
  21. #define XXX 3 /* Node alignment factor to speed up realloc */
  22. #define XXXROUNDUP(n) ((n) == 1 ? 1 : ((n) + XXX - 1) / XXX * XXX)
  23.  
  24. node *
  25. PyNode_AddChild(n1, type, str, lineno)
  26.     register node *n1;
  27.     int type;
  28.     char *str;
  29.     int lineno;
  30. {
  31.     register int nch = n1->n_nchildren;
  32.     register int nch1 = nch+1;
  33.     register node *n;
  34.     if (XXXROUNDUP(nch) < nch1) {
  35.         n = n1->n_child;
  36.         nch1 = XXXROUNDUP(nch1);
  37.         PyMem_RESIZE(n, node, nch1);
  38.         if (n == NULL)
  39.             return NULL;
  40.         n1->n_child = n;
  41.     }
  42.     n = &n1->n_child[n1->n_nchildren++];
  43.     n->n_type = type;
  44.     n->n_str = str;
  45.     n->n_lineno = lineno;
  46.     n->n_nchildren = 0;
  47.     n->n_child = NULL;
  48.     return n;
  49. }
  50.  
  51. /* Forward */
  52. static void freechildren Py_PROTO((node *));
  53.  
  54.  
  55. void
  56. PyNode_Free(n)
  57.     node *n;
  58. {
  59.     if (n != NULL) {
  60.         freechildren(n);
  61.         PyMem_DEL(n);
  62.     }
  63. }
  64.  
  65. static void
  66. freechildren(n)
  67.     node *n;
  68. {
  69.     int i;
  70.     for (i = NCH(n); --i >= 0; )
  71.         freechildren(CHILD(n, i));
  72.     if (n->n_child != NULL)
  73.         PyMem_DEL(n->n_child);
  74.     if (STR(n) != NULL)
  75.         PyMem_DEL(STR(n));
  76. }
  77.